const { app, shell } = require("electron")
const fs = require("fs")
const { Big } = require("big.js")
/**
 * 获取文件图标。
 * 系统关联图标
 * @param path - 文件路径
 */
const getFileIcon = async (path) => {
  const iconDefault = './icon_default.png'
  if (!path) Promise.resolve(iconDefault)

  const icon = await app.getFileIcon(path, {
    size: 'normal',
  })

  return icon.toDataURL()
}

/**
 * 打开文件
 * @param path - 文件路径
 */
const openFile = async (path) => {
  if (!isExistFile(path)) return false

  await shell.openPath(path)
  return true
}

/**
 * 打开文件所在位置
 * @param path - 文件路径
 */
const openFileInFolder = (path) => {
  if (!isExistFile(path)) return false

  shell.showItemInFolder(path)
  return true
}

/**
 * 检查文件是否存在
 * @param path - 文件路径
 */
const isExistFile = (path) => fs.existsSync(path)

/**
 * 计算项目下所有下载项的总大小
 */
const computeFileSize = (listData) => {
  if (listData.length === 0) return 0

  const fileSizeList = listData.map(item => {
    // item.fileSize = convertUnitToBytes(item.fileSize) // 所有下载项都返回指定格式的文件大小(字节待前端转换)
    item.paused = true // 默认所有下载项都是暂停状态，后续下载会改变下载状态
    // item.state = 1
    item.updateTime = new Date().getTime()
    return item.fileSize
  })
  const result = sumByteStrings(fileSizeList)
  return result
}

/**
 * 计算多个字节字符串的总和
 * @param {string[]} byteStrings - 一个或多个以十六进制表示的字节字符串
 * @returns {string} 返回所有输入字节字符串总和的十六进制字符串表示
 */
function sumByteStrings(byteStrings) {
  let totalBytes = Big(0);

  // 遍历字符串数组，将每个字符串解析为 BigInt 类型并相加
  for (const byteString of byteStrings) {
    // 将字节数字符串解析为 BigInt 类型并累加到 totalBytes
    totalBytes = totalBytes.plus(Big(byteString))
  }

  // 返回总字节数的字符串表示形式
  return totalBytes.toFixed(2)
}

/**
 * 类转换字节数
 * @param {*} valueWithUnit 
 * @returns 字节数的字符串
 */
function convertUnitToBytes(valueWithUnit) {
  // 提取值和单位
  const match = valueWithUnit.match(/^(\d+(?:\.\d+)?)\s*([a-zA-Z]+)$/);
  if (!match) {
    throw new Error('Invalid input');
  }
  console.log(match)
  const value = match[1];
  const unit = match[2];
  // 定义单位及其对应的字节大小
  const units = {
    B: Big(1),
    KB: Big(1024),
    MB: Big(1024).pow(2),
    GB: Big(1024).pow(3),
    TB: Big(1024).pow(4),
    PB: Big(1024).pow(5),
  };

  // 将输入的值转换为 BigInt 类型
  const bigValue = Big(value)
  // 获取对应单位的字节大小
  const bigUnit = units[unit.toUpperCase()];
  // 如果未找到对应的单位，则抛出错误
  if (!bigUnit) {
    throw new Error('Invalid unit');
  }

  // 计算并返回转换后的值
  return (bigValue * bigUnit).toFixed(2)
}

/**
 * 下载状态枚举
 * @param state
 * @return {number} 0: 无状态
 * @return {number} 1: 任务在排队(等待中)
 * @return {number} 2: 任务正在运行(下载中)
 * @return {number} 3: 任务已暂停
 * @return {number} 4: 任务已完成
 * @return {number} 5: 任务已取消
 * @return {number} 6: 任务已失败
 * @return {number} 7: 任务已重试
 */
function enumDownloadState(state) {
  let downloadState = 1 // 等待中
  switch (state) {
    case "STARTED": // 开始下载
    case "RESUMED": // 恢复下载
      downloadState = 1;
      break;
    case "DOWNLOADING": // 正在下载
      downloadState = 2;
      break;
    case "PAUSED": // 暂停
      downloadState = 3;
      break;
    case "FINISHED": // 完成
      downloadState = 4
      break;
    case "STOPPED": // 取消
      downloadState = 5
      break;
    case "FAILED": // 失败
      downloadState = 6
      break;
    case "RETRY": // 重试
      downloadState = 7
      break;
  }
  return downloadState
}

/**
 * 跳过登录认证加密请求头
 */

module.exports = {
  getFileIcon,
  openFile,
  openFileInFolder,
  computeFileSize,
  sumByteStrings,
  enumDownloadState
}